package neuroPoker4.netze.input;

import java.util.ArrayList;

import neuroPoker.netze.NetAction;
import neuroPoker.netze.NetKarte;
import neuroPoker.netze.PokerInputSit;
import neuroPoker.poker.Spieler;
import neuroPoker.poker.Tisch;
import neuroPoker.poker.Enums.Actions;
import neuroPoker.poker.Enums.Stages;
import neuroPoker4.netze.tool.NetAction2;
import neuroPoker4.netze.tool.Util;

public class FlopInputSitBR1 extends PokerInputSit {

	public NetKarte[] handKarten = new NetKarte[2];

	public NetKarte[] flopKarten = new NetKarte[3];

	public ArrayList<NetAction> pfActionBR1 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> pfActionBR2 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> pfActionBR3 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> pfActionBR4 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> flopActionBR1 = new ArrayList<NetAction>(9);

	public void init(Tisch tisch, Spieler spieler) {
		this.spieler = spieler;
		// input
		// 2 Karten
		handKarten[0] = spieler.karten[0];
		handKarten[1] = spieler.karten[1];

		// flopkarten
		flopKarten[0] = tisch.karten.get(0);
		flopKarten[1] = tisch.karten.get(1);
		flopKarten[2] = tisch.karten.get(2);

		// preflop br1 action
		pfActionBR1 = getPrevBRAction(tisch, spieler, Stages.preFlop, 1);
		// preflop br2 action
		pfActionBR2 = getPrevBRAction(tisch, spieler, Stages.preFlop, 2);
		// preflop br3 action
		pfActionBR3 = getPrevBRAction(tisch, spieler, Stages.preFlop, 3);
		// preflop br4 action
		pfActionBR4 = getPrevBRAction(tisch, spieler, Stages.preFlop, 4);

		// flop br1 action
		flopActionBR1 = getActBRAction(tisch, spieler, Stages.flop, 1);
	}

	public double[] getInput() {
		// 5*19-1 = 94
		// 5*6 = 30 -> 124
		// 124 input neuronen
		double[] input = new double[124];
		// kartenbits setzen
		// handkarten + flopkarten
		NetKarte[] netKarten = Util.concat(handKarten, flopKarten);
		input = Util.setKartenBits(input, netKarten);

		// spieleraction bits setzen br1
		input = Util.setSpielerActionBits(input, pfActionBR1, 5, 1);
		// spieleraction bits setzen br2
		input = Util.setSpielerActionBits(input, pfActionBR2, 5, 2);
		// spieleraction bits setzen br3
		input = Util.setSpielerActionBits(input, pfActionBR3, 5, 3);
		// spieleraction bits setzen br4
		input = Util.setSpielerActionBits(input, pfActionBR4, 5, 4);
		// spieleraction bits setzen flop br1
		input = Util.setSpielerActionBits(input, flopActionBR1, 5, 5);

		return input;
	}

	@Override
	protected NetAction getNewNetAction(int action) {
		return new NetAction2(action);
	}

	@Override
	protected NetAction getNewNetAction(Actions action) {
		return new NetAction2(NetAction.toActionConst(action));
	}

	@Override
	public boolean isLastActionFold() {
		return flopActionBR1.get(flopActionBR1.size() - 1).equals(
				NetAction.fold);
	}

	@Override
	public int getAnzInputNeurons() {
		return 124;
	}

}
